package com.jsbs.iam.user.mapper;

import com.jsbs.iam.user.dto.*;
import com.jsbs.iam.user.entity.IamOrgFramework;
import com.jsbs.iam.user.entity.IamOrgTypeExtendedField;
import com.jsbs.iam.user.entity.IamOrganizationTypeBase;
import com.jsbs.iam.user.vo.OrgTypeFieldInfoVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @BelongsProject: iam
 * @BelongsPackage: com.jsbs.iam.user.mapper
 * @Author: WangJiYuan
 * @Description: TODO
 * @Version: 2022-12-02  17:36
 */
@Mapper
@Repository
public interface OrgTypeMapper {
    /**
     * 新增组织类型
     * @param orgTypeAddDto
     */
    void addOrgType(@Param("orgTypeAddDto") OrgTypeAddDto orgTypeAddDto);

    /**
     * 根据组织类型获取组织类型下组织数量
     *
     * @param orgTypeCode
     * @param companyCode
     * @return
     */
    int selectOrgCount(@Param("orgTypeCode") String orgTypeCode, @Param("companyCode")  String companyCode);

    /**
     * 根据组织类型获取用户数量
     *
     * @param orgTypeCode
     * @param companyCode
     * @return
     */
    int selectOrgUserCount(@Param("orgTypeCode") String orgTypeCode, @Param("companyCode")  String companyCode);

    /**
     * 根据组织类型获取组织数据
     *
     * @param orgTypeCode
     * @param companyCode
     * @return
     */
    List<IamOrgFramework> selectOrgInfo(@Param("orgTypeCode") String orgTypeCode, @Param("companyCode") String companyCode);

    /**
     * 新增组织类型字段
     * @param orgTypeFieldAddDto
     */
    void addOrgTypeField(@Param("orgTypeFieldAddDto")OrgTypeFieldAddDto orgTypeFieldAddDto);

    /**
     * 修改字段
     * @param orgTypeFieldUpdateDto
     */
    void updateOrgTypeField(@Param("orgTypeFieldUpdateDto")OrgTypeFieldUpdateDto orgTypeFieldUpdateDto);

    /**
     * 根据字段id逻辑删除字段
     * @param orgTypeFieldUpdateDto
     */
    void deleteOrgTypeFieldById(@Param("orgTypeFieldUpdateDto") OrgTypeFieldUpdateDto orgTypeFieldUpdateDto);

    /**
     * 查询对应组织类型下所有字段
     * @param orgTypeFieldSelectDto
     * @return
     */
    List<OrgTypeFieldInfoVo> selectOrgTypeFieldList(@Param("orgTypeFieldSelectDto")OrgTypeFieldSelectDto orgTypeFieldSelectDto);

    /**
     * 根据组织类型编码查询字段数据
     * @param orgTypeFieldUpdateDto
     * @return
     */
    List<IamOrgTypeExtendedField> selectFieldListByOrgTypeCode(@Param("orgTypeFieldUpdateDto")OrgTypeFieldUpdateDto orgTypeFieldUpdateDto);

    /**
     * 根据字段id集合,查询所有字段数据
     *
     * @param fieldIds
     * @param companyCode
     * @return
     */
    List<IamOrgTypeExtendedField> selectFieldListById(@Param("fieldIds") List<String> fieldIds, @Param("companyCode") String companyCode);


    /**
     * 批量插入字段数据
     * @param list
     */
    void insertFieldData(@Param("list")List<IamOrgTypeExtendedField> list);

    /**
     * 查询组织类型数据
     * @param companyCode
     * @return
     */
    List<IamOrganizationTypeBase> getOrgTypeData(@Param("companyCode") String companyCode);

    /**
     * 获取字段id
     * @return
     */
    String selectFieldCode(@Param("companyCode") String companyCode);

    /**
     * 获取组织类型编码
     * @return
     */
    String selectOrgTypeId(@Param("companyCode") String companyCode);

    /**
     * 逻辑删除组织数据
     * @param deleteDto
     */
    void deleteSubOrg(@Param("deleteDto") OrgTypeDeleteDto deleteDto);

    /**
     * 根据组织类型编码逻辑删除组织类型
     * @param deleteDto
     */
    void deleteOrgType(@Param("deleteDto") OrgTypeDeleteDto deleteDto);

    /**
     * 校验组织类型名称是否唯一
     *
     * @param orgTypeName
     * @param companyCode
     * @return
     */
    int checkTypeName(@Param("orgTypeName") String orgTypeName, @Param("companyCode") String companyCode);

    /**
     * 根据id逻辑删除字段存储的数据
     * @param orgTypeFieldUpdateDto
     */
    void deleteOrgTypeFieldValueById(@Param("orgTypeFieldUpdateDto") OrgTypeFieldUpdateDto orgTypeFieldUpdateDto);

    /**
     * 校验输入的组织类型编码是否唯一
     *
     * @param orgTypeCode
     * @param companyCode
     * @return
     */
    int checkTypeCode(@Param("orgTypeCode") String orgTypeCode, @Param("companyCode") String companyCode);

    /**
     * 删除字段数据
     * @param deleteDto
     */
    void deleteOrgTypeFieldData(@Param("deleteDto") OrgTypeDeleteDto deleteDto);

    /**
     * 删除字段保存的数据
     * @param deleteDto
     */
    void deleteOrgTypeExtendData(@Param("deleteDto")OrgTypeDeleteDto deleteDto);

    /**
     * 获取普通管理员的组织类型数据
     * @param adminRoleCode
     * @param companyCode
     * @return
     */
    List<IamOrganizationTypeBase> getAdminRoleOrgTypeData(@Param("adminRoleCode")String adminRoleCode, @Param("companyCode")String companyCode);
}
